#Boa:Frame:Frame1

import wx
import wx.gizmos
import MySQLdb
import MySQLdb.cursors
import consultasBD
import utiles
import os
import shutil
import Image
import buscar

dirFotos = "\\fotossussan\\"
dirTrabajo = "\\fotossussan\\thumbnail\\"

extension = "jpg"
width_s = 480
height_s = 320
width_rs = 800
height_rs = 533

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1BUTTON3, 
 wxID_FRAME1BUTTON4, wxID_FRAME1BUTTON5, wxID_FRAME1CHOICE1, 
 wxID_FRAME1GAUGE1, wxID_FRAME1GENERICDIRCTRL1, wxID_FRAME1LISTBOX1, 
 wxID_FRAME1PANEL1, wxID_FRAME1STATICBITMAP1, wxID_FRAME1STATICLINE1, 
 wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, wxID_FRAME1STATICTEXT3, 
 wxID_FRAME1TEXTCTRL1, wxID_FRAME1TEXTCTRL2, wxID_FRAME1TEXTCTRL3, 
] = [wx.NewId() for _init_ctrls in range(19)]

def verificarArchivosNecesarios(archivo):
    resultado = True
    #se verifica la existencia de archivos y directorios
    #necesarios para la ejecucion de la aplicacion
    if not os.path.lexists(archivo):
        resultado = False
    return resultado

class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(460, 88), size=wx.Size(829, 525), style=wx.CLOSE_BOX,
              title='Nuevas Fotos')
        self.SetClientSize(wx.Size(821, 498))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(821, 498),
              style=wx.TAB_TRAVERSAL)

        self.button4 = wx.Button(id=wxID_FRAME1BUTTON4, label='Aceptar',
              name='button4', parent=self.panel1, pos=wx.Point(320, 448),
              size=wx.Size(115, 39), style=0)
        self.button4.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button4.Enable(False)
        self.button4.Bind(wx.EVT_BUTTON, self.OnButtonAceptar,
              id=wxID_FRAME1BUTTON4)

        self.button5 = wx.Button(id=wxID_FRAME1BUTTON5, label='Buscar',
              name='button5', parent=self.panel1, pos=wx.Point(440, 448),
              size=wx.Size(112, 40), style=0)
        self.button5.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button5.Enable(False)
        self.button5.Bind(wx.EVT_BUTTON, self.OnButtonBuscar,
              id=wxID_FRAME1BUTTON5)

        self.button3 = wx.Button(id=wxID_FRAME1BUTTON3, label='Cancelar',
              name='button3', parent=self.panel1, pos=wx.Point(560, 448),
              size=wx.Size(115, 39), style=0)
        self.button3.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button3.Enable(False)
        self.button3.Bind(wx.EVT_BUTTON, self.OnButtonCancelar,
              id=wxID_FRAME1BUTTON3)

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Salir',
              name='button1', parent=self.panel1, pos=wx.Point(680, 448),
              size=wx.Size(115, 39), style=0)
        self.button1.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.button1.Bind(wx.EVT_BUTTON, self.OnButtonSalir,
              id=wxID_FRAME1BUTTON1)

        self.staticBitmap1 = wx.StaticBitmap(bitmap=wx.NullBitmap,
              id=wxID_FRAME1STATICBITMAP1, name='staticBitmap1',
              parent=self.panel1, pos=wx.Point(320, 16), size=wx.Size(480, 320),
              style=0)

        self.staticLine1 = wx.StaticLine(id=wxID_FRAME1STATICLINE1,
              name='staticLine1', parent=self.panel1, pos=wx.Point(319, 15),
              size=wx.Size(482, 322), style=0)

        self.genericDirCtrl1 = wx.GenericDirCtrl(defaultFilter=0, dir='.',
              filter='.abcd1023.z.o.p', id=wxID_FRAME1GENERICDIRCTRL1,
              name='genericDirCtrl1', parent=self.panel1, pos=wx.Point(16, 16),
              size=wx.Size(296, 184),
              style=wx.DIRCTRL_3D_INTERNAL | wx.SUNKEN_BORDER)
        self.genericDirCtrl1.SetWindowVariant(wx.WINDOW_VARIANT_NORMAL)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2,
              label='Procesar fotos en directorio', name='button2',
              parent=self.panel1, pos=wx.Point(16, 200), size=wx.Size(296, 23),
              style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButtonSeleccionar,
              id=wxID_FRAME1BUTTON2)

        self.textCtrl1 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL1, name='textCtrl1',
              parent=self.panel1, pos=wx.Point(16, 224), size=wx.Size(296, 21),
              style=0, value='')
        self.textCtrl1.SetEditable(False)

        self.listBox1 = wx.ListBox(choices=[], id=wxID_FRAME1LISTBOX1,
              name='listBox1', parent=self.panel1, pos=wx.Point(16, 248),
              size=wx.Size(296, 240), style=0)
        self.listBox1.Show(True)
        self.listBox1.Enable(False)
        self.listBox1.Bind(wx.EVT_LISTBOX, self.OnListBox1Listbox,
              id=wxID_FRAME1LISTBOX1)

        self.gauge1 = wx.Gauge(id=wxID_FRAME1GAUGE1, name='gauge1',
              parent=self.panel1, pos=wx.Point(16, 256), range=100,
              size=wx.Size(296, 16), style=wx.GA_HORIZONTAL)
        self.gauge1.Show(False)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1,
              label='Descripcion del producto', name='staticText1',
              parent=self.panel1, pos=wx.Point(320, 344), size=wx.Size(117, 13),
              style=0)

        self.textCtrl2 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL2, name='textCtrl2',
              parent=self.panel1, pos=wx.Point(320, 360), size=wx.Size(480, 21),
              style=0, value='')
        self.textCtrl2.Enable(False)

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2,
              label='Codigo Sussan', name='staticText2', parent=self.panel1,
              pos=wx.Point(320, 384), size=wx.Size(70, 13), style=0)

        self.textCtrl3 = wx.TextCtrl(id=wxID_FRAME1TEXTCTRL3, name='textCtrl3',
              parent=self.panel1, pos=wx.Point(320, 400), size=wx.Size(160, 21),
              style=0, value='')
        self.textCtrl3.Enable(False)

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3,
              label='P.T.C.', name='staticText3', parent=self.panel1,
              pos=wx.Point(488, 384), size=wx.Size(31, 13), style=0)

        self.choice1 = wx.Choice(choices=[], id=wxID_FRAME1CHOICE1,
              name='choice1', parent=self.panel1, pos=wx.Point(488, 400),
              size=wx.Size(160, 21), style=0)
        self.choice1.Enable(False)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.padre = parent
        tree = self.genericDirCtrl1.GetTreeCtrl()
        tree.Bind(wx.EVT_KEY_UP, self.OnGenericDirCtrl1KeyUp)
        tree.Bind(wx.EVT_KEY_DOWN, self.OnGenericDirCtrl1KeyDown)
        tree.Bind(wx.EVT_LEFT_DCLICK, self.OnGenericDirCtrl1LeftDclick)
        tree.Bind(wx.EVT_LEFT_UP, self.OnGenericDirCtrl1LeftUp)
        tree.Bind(wx.EVT_LEFT_DOWN, self.OnGenericDirCtrl1LeftDown)

        self.conectado = None
        if self.verificarConexionBD():
            self.verificarCrearDirectorios()
            self.genericDirCtrl1.SetPath("\\")
            self.dirActual = ""
            self.genericDirCtrl1.SetFocus()
        else:
            exit()
            
    def verificarConexionBD(self):
        try:
            self.sucursalActiva, self.conectado = utiles.getSucursalActiva(self.conectado)
        except:
            texto = "No hay conexion con la Base de Datos\nVerifique con su administrador."
            utiles.mensaje(None, texto)
            return False
        return True
#        print "Intentando conectar a la BD",servers.db_name
#        try:
#            #host,user,passwd,name_database
#            conectar=MySQLdb.connect(host=servers.host, 
#                        user=servers.user, passwd=servers.passwd, db=servers.db_name, 
#                        cursorclass=MySQLdb.cursors.DictCursor)
#            cursor=conectar.cursor()
#        except:
#            print "La conexion a la BD no pudo establecerse"
#            utiles.mensaje(None,"No hay conexion con la Base de Datos")
#            exit()

    def verificarCrearDirectorios(self):
        #verifica que existan los directorios del sistema y crea los de trabajo
        try:
            if not verificarArchivosNecesarios(dirFotos):
                print "creando directorio",dirFotos
                os.mkdir(dirFotos)
            if not verificarArchivosNecesarios(dirTrabajo):
                print "creando directorio",dirTrabajo
                os.mkdir(dirTrabajo)
            else:
                print "Eliminando copias viejas y creando directorio"
                shutil.rmtree(dirTrabajo)
                os.mkdir(dirTrabajo)
        except:
            texto1 = "Error en el disco o en la creacion\n"
            texto2 = "de directorios de trabajo. Verifique"
            texto = texto1 + texto2
            utiles.mensaje(None, texto)
            exit()

    def creandoThumbnail(self):
        #recorre uno a uno cada archivo jpg y lo redimensiona
        self.gauge1.Show(True)
        cantidadArchivos = self.listBox1.GetCount()
        self.gauge1.SetRange(cantidadArchivos)
        directorio = self.genericDirCtrl1.GetPath()
        items = self.listBox1.GetItems()
        i = 1
        for archivo in items:
            miImagen = Image.open(directorio + "\\" + archivo)
            auxiliar = miImagen.resize((width_s, height_s), Image.ANTIALIAS)
            auxiliar.save(dirTrabajo + archivo)
            self.gauge1.SetValue(i)
            i += 1
        self.gauge1.Show(False)
        
    def llenarListBox(self):
        try:
            archivos = os.listdir(self.textCtrl1.GetValue())
        except:
            archivos = []
        bandera = False
        for x in archivos:
            if ("."+extension) in x:
                self.listBox1.Append(x)
                bandera = True
        return bandera
        
    def OnButtonSeleccionar(self, event):
        if self.genericDirCtrl1.GetPath() == "":
            texto = "Debe seleccionar alguna de las unidades visualizadas"
            utiles.mensaje(None, texto)
            return 1
        self.genericDirCtrl1.Enable(False)
        self.button2.Enable(False)
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath()) #directorio
        if not self.llenarListBox():
            self.OnButtonCancelar(None)
            texto = "No hay imagenes JPG en el directorio seleccionado"
            utiles.mensaje(None,texto)
        else:
            print "Procesando imagenes"
            self.creandoThumbnail()
            self.listBox1.Enable(True)
            self.listBox1.Select(0)
            self.button3.Enable(True)
            self.button5.Enable(True)
            self.OnListBox1Listbox(None) #carga la imagen en el wxbitmap
            self.textCtrl2.Enable(True)
            self.textCtrl3.Enable(True)
            self.textCtrl3.SetFocus()

    def OnButtonCancelar(self, event):
        if self.textCtrl2.GetValue() != "":
            self.button4.Enable(False) #aceptar
            self.choice1.Clear()
            self.choice1.Enable(False)
            self.textCtrl2.SetValue("") #descripcion
            self.textCtrl3.SetValue("") #codsussan
            self.textCtrl3.SetFocus() #codsussan
            return 0
        self.verificarCrearDirectorios()
        self.genericDirCtrl1.Enable(True)
        self.button2.Enable(True) #seleccionar directorio
        self.listBox1.Enable(False)
        self.button3.Enable(False) #salir
        self.button5.Enable(False) #buscar
        self.textCtrl2.Enable(False) #descripcion
        self.textCtrl3.Enable(False) #codsussan
        self.genericDirCtrl1.SetFocus()
        self.textCtrl1.SetValue("")
        self.listBox1.Clear()
        self.staticBitmap1.SetBitmap(wx.NullBitmap)
        self.staticBitmap1.SetSize(wx.Size(width_s, height_s))
        return 0

    def OnButtonSalir(self, event, salida=0):
        #if self.textCtrl1.GetValue() != "":
        #    texto1 = "ESTA SEGURO DE QUERER SALIR\n\n"
        #    texto2 = "Si abandona la aplicacion ahora, no se procesaran las\n"
        #    texto3 = "fotografias aun no seleccionadas.\n\n"
        #    texto4 = "( ACEPTAR / CANCELAR )"
        #    texto = texto1 + texto2 + texto3 + texto4
        #    if not utiles.dialog2(None, texto):
        #        return 0
        try:
            print "Eliminando el directorio de trabajo"
            shutil.rmtree(dirTrabajo)
        except:
            print "Problemas al eliminar el directorio de trabajo"
        self.padre.Show(True)
        self.padre.Enable(True)
        self.padre.button1.SetFocus()
        self.Close()

    def OnListBox1Listbox(self, event):
        #se carga la imagen seleccionada del listbox en el wxbitmap
        items = self.listBox1.GetItems()
        item = self.listBox1.GetSelection()
        dirImagen = dirTrabajo + "\\" + items[item]
        miImagenWxBitmap = wx.Bitmap(dirImagen,wx.BITMAP_TYPE_JPEG)
        self.staticBitmap1.SetBitmap(miImagenWxBitmap)

    def buscarProductoPorCodigo(self):
        #se consulta la BD para buscar la descripcion del producto, si existe
        codsussan = self.textCtrl3.GetValue()
        sentenciaSQL = "SELECT codsussan,descri FROM productos WHERE codsussan"
        sentenciaSQL = sentenciaSQL + " = '" + codsussan + "'"
        resultado, self.conectado = consultasBD.ordenCrudaDict(sentenciaSQL, self.conectado)
        if len(resultado) == 0:
            texto = "No hay producto con el codigo ingresado"
            utiles.mensaje(None, texto)
            self.textCtrl3.SetFocus()
            return 1
        if len(resultado) > 1:
            texto1 = "Error: se han encontrado mas de un\n"
            texto2 = "articulo con el mismo codigo."
            texto = texto1 + texto2
            utiles.mensaje(None, texto)
            self.textCtrl3.SetFocus()
            return 1
        self.textCtrl2.SetValue(resultado[0]['descri'])
        self.buscarPTCteniendoCodigo(codsussan)
        return 0

    def buscarPTCteniendoCodigo(self, codsussan):
        #se busca los codigos PTC, si existen
        self.choice1.Clear()
        sentenciaSQL = "SELECT id FROM producto_talle_color WHERE codsussan"
        sentenciaSQL = sentenciaSQL + " = '" + codsussan + "'"
        resultado, self.conectado = consultasBD.ordenCrudaDict(sentenciaSQL, self.conectado)
        self.choice1.Append("")
        self.choice1.SetSelection(0)
        if len(resultado) > 0:
            for x in resultado:
                self.choice1.Append(x['id'])
            self.choice1.Enable(True)
            self.choice1.SetSelection(0)
        self.button4.Enable(True)
        self.choice1.SetFocus()

    def OnButtonBuscar(self, event):
        #if self.textCtrl2.GetValue() == "" and self.textCtrl3.GetValue() == "":
        #    return 1
        if self.textCtrl3.GetValue() != "":
            self.buscarProductoPorCodigo()
            return 0
        valor = self.textCtrl2.GetValue()
        dlg = buscar.Dialog1(self, valor)
        try:
            dlg.ShowModal()
            valor = dlg.codigo
            descripcion = dlg.descripcion
        finally:
            dlg.Destroy()
        self.textCtrl2.SetValue(descripcion)
        self.textCtrl3.SetValue(valor)
        self.button5.SetFocus()
        if self.textCtrl3.GetValue() != "":
            self.OnButtonBuscar(None)

    def directorioActual(self):
        if self.dirActual == "":
            #determino directorio de almacenaje y lo creo por unica vez
            #el directorio quedara como \fotossussan\<fecha-inversa><hora>\
            a1 = utiles.getfechaInverseTime()
            aux = a1[0:4]+a1[5:7]+a1[8:10]+a1[11:13]+a1[14:16]+a1[17:19]
            self.dirActual = dirFotos + aux + "\\"
        if not verificarArchivosNecesarios(self.dirActual):
            print "creando directorio",self.dirActual
            os.mkdir(self.dirActual)

    def habilitarInterfazDespuesDeAceptar(self):
        if self.listBox1.GetItems() != []: 
            self.listBox1.Select(0)
            self.OnListBox1Listbox(None)
            self.textCtrl2.SetValue("")
            self.textCtrl3.SetValue("")
            self.textCtrl3.SetFocus()
            self.button1.Enable(True)
            self.button3.Enable(True)
            self.button5.Enable(True)
        else:
            self.button1.Enable(True)
            self.button2.Enable(True)
            self.listBox1.Enable(False)
            self.textCtrl1.SetValue("")
            self.textCtrl2.Enable(False)
            self.textCtrl2.SetValue("")
            self.textCtrl3.Enable(False)
            self.textCtrl3.SetValue("")
            self.genericDirCtrl1.Enable(True)
            self.genericDirCtrl1.SetFocus()
            self.staticBitmap1.SetBitmap(wx.NullBitmap)
            self.staticBitmap1.SetSize(wx.Size(width_s, height_s))
        self.choice1.Clear()
        self.choice1.Enable(False)

    def guardarEnBD(self, ptc, codsussan, directorio, archivo):
        opcion = True
        reemplaza = False
        print "- verificando existencia de la imagen en la BD"
        consultaSQL = "SELECT directorio, archivo FROM fotossussan WHERE ptc='%s' AND codsussan='%s'" % (ptc, codsussan)
        print "-",consultaSQL
        try:
            resultado, self.conectado = consultasBD.ordenCrudaDict(consultaSQL, self.conectado)
        except:
            texto = "ERROR EN LA BASE DE DATOS"
            print texto
            utiles.mensaje(None, texto)
            opcion = False
            return opcion
        if len(resultado) > 0:
            #ya existe un elemento en la BD con ese codigo y ptc
            texto1 = "ATENCION\n\n"
            texto2 = "Existe en la BD una imagen asignada a este producto.\n"
            texto3 = "Si insiste, puede reemplazarla en la Base de Datos.\n"
            texto4 = "Verifique el Codigo Sussan y el P.T.C.\n\n"
            texto5 = "ACEPTAR = reemplaza la imagen por la actual\n"
            texto6 = "CANCELAR = no se procesa esta imagen"
            texto = texto1 + texto2 + texto3 + texto4 + texto5 + texto6
            if not utiles.dialog2(None, texto):
                opcion = False
                return opcion
            print "- borrando imagen antigua en el directorio"
            print "- DEL ",resultado[0]['directorio']+resultado[0]['archivo']
            os.remove(resultado[0]['directorio']+resultado[0]['archivo'])
            reemplaza = True
        aux = directorio.split("\\")
        aux = aux[1:-1]
        directorio = "\\\\"
        for x in aux:
            directorio += x + "\\\\"
        if not reemplaza:
            #se inserta una nuevo valor
            print "- la imagen no existe en la BD y se la da de alta"
            aux1 = "INSERT INTO fotossussan(ptc, codsussan, directorio, archivo) "
            aux2 = "VALUES ('%s','%s','%s','%s')" % (ptc, codsussan, directorio, archivo)
            aux3 = ""
        else:
            #se modifica uno actual
            print "- la imagen ya existe y se reemplaza"
            aux1 = "UPDATE fotossussan SET "
            aux2 = "directorio = '%s', archivo = '%s' " % (directorio, archivo)
            aux3 = "WHERE ptc = '%s' AND codsussan = '%s'" % (ptc, codsussan)
        consultaSQL = aux1 + aux2 + aux3
        print "-",consultaSQL
        try:
            ultimoid, self.conectado = consultasBD.executa(None, consultaSQL, self.conectado)
        except:
            texto = "ERROR EN LA BASE DE DATOS"
            print texto
            utiles.mensaje(None, texto)
            return False
        if ultimoid == []:
            texto = "ERROR EN LA BASE DE DATOS"
            print texto
            utiles.mensaje(None, texto)
            return False
        return opcion

    def OnButtonAceptar(self, event):
        #inhabilitando botones
        self.button1.Enable(False)
        self.button3.Enable(False)
        self.button4.Enable(False)
        self.button5.Enable(False)

        self.directorioActual() #check directorio actual, lo crea si necesario

        print "Procesando imagen"
        nameOriginal = self.listBox1.GetItems()[self.listBox1.GetSelection()]
        dirImgOrig = self.textCtrl1.GetValue() + "\\" + nameOriginal
        archivo = self.textCtrl3.GetValue()+self.choice1.GetStringSelection()+".jpg"
        miImagen = Image.open(dirImgOrig)
        print "- redimensionando"
        aux = miImagen.resize((width_rs, height_rs), Image.ANTIALIAS)
        print "- almacenando en la Base de Datos"
        ptc = self.choice1.GetStringSelection()
        codsussan = self.textCtrl3.GetValue()
        directorio = self.dirActual
        if self.guardarEnBD(ptc, codsussan, directorio, archivo):
            print "- almacenando en disco la imagen redimensionada"
            aux.save(self.dirActual + archivo)
            print "- eliminando imagen original"
            os.remove(dirImgOrig)
            print "- eliminando de la lista"
            self.listBox1.Delete(self.listBox1.GetSelection())

        self.habilitarInterfazDespuesDeAceptar()

    def OnGenericDirCtrl1KeyUp(self, event):
        self.listBox1.Clear()
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath())
        self.llenarListBox()
        event.Skip()
    
    def OnGenericDirCtrl1KeyDown(self, event):
        self.listBox1.Clear()
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath())
        self.llenarListBox()
        event.Skip()

    def OnGenericDirCtrl1LeftDclick(self, event):
        self.listBox1.Clear()
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath())
        self.llenarListBox()
        event.Skip()
        
    def OnGenericDirCtrl1LeftUp(self, event):
        self.listBox1.Clear()
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath())
        self.llenarListBox()
        event.Skip()
        
    def OnGenericDirCtrl1LeftDown(self, event):
        self.listBox1.Clear()
        self.textCtrl1.SetValue(self.genericDirCtrl1.GetPath())
        self.llenarListBox()
        event.Skip()
